package com.hedl.practice.diyJava.regexs.study_matching_rule.test;

public class Main {
    public static void main(String[] args) {
        /**
         * 正则表达式的使用：
         *      正则表达式的匹配规则是从左到右按规则匹配；
         *      如果正则表达式有特殊字符，那就需要用\转义；
         *      注意正则表达式在Java代码中也是一个字符串，所以，对于正则表达式a\&c来说，对应的Java字符串是"a\\&c"，因为\也是Java字符串的转义字符，两个\\实际上表示的是一个\
         */
         String rel = "abc";
        System.out.println("abc".matches(rel));
        System.out.println("Abc".matches(rel));
        System.out.println("abcd".matches(rel));

        System.out.println("=======================学会使用正则表达式===============");

        String re1 = "a\\&c";
        System.out.println("a&c".matches(re1));
        System.out.println("a-c".matches(re1));
        System.out.println("a&&c".matches(re1));

        System.out.println("======================匹配任意字符================");
        /**
         *  .   是用与匹配任意字符的
         */
        String re2 = "a.c";
        System.out.println("abc".matches(re2));
        System.out.println("ab".matches(re2));
        System.out.println("ac".matches(re2));
        System.out.println("a&c".matches(re2));
        System.out.println("a=c".matches(re2));
        System.out.println("a==c".matches(re2));        //false

        System.out.println("=======================匹配数字==================");
        /**
         *      \d      匹配范围0-9
         *      注意：只能匹配一个字符，想要多个是不可行，但是可以写成这样：00\\d     ->  006     这样是可以的
         */
        String re3 = "\\d";
        String re4 = "12\\d";
        System.out.println("1".matches(re3));       //true
        System.out.println("12".matches(re3));      //false
        System.out.println("4".matches(re3));       //true
        System.out.println("a".matches(re3));       //false

        System.out.println("123".matches(re4));     //true
        System.out.println("213".matches(re4));     //false
        System.out.println("12a".matches(re4));     //false

        System.out.println("======================匹配常用字符==================");
        /**
         *      \w      可以匹配一个字母、数字或下划线
         */
        String re5 = "H\\w";
        System.out.println("Hh".matches(re5));      //true
        System.out.println("HHh".matches(re5));     //false
        System.out.println("hh".matches(re5));      //false
        System.out.println("H=".matches(re5));      //false
        System.out.println("H#".matches(re5));      //false
        System.out.println("H+".matches(re5));      //false
        System.out.println("H_".matches(re5));      //true
        System.out.println("H/".matches(re5));      //false
        System.out.println("H1".matches(re5));      //true

        System.out.println("=========================匹配空格字符=================");
        /**
         *  \s   可以匹配一个空格字符，注意空格字符不但包括空格，还包括tab字符(在Java中用\t表示）
         */
        String re6 = "Hello\\sWorld";
        String re7 = "Hello\\tWorld";
        System.out.println("Hello World".matches(re6));     //true
        System.out.println("HelloWorld".matches(re6));      //false
        System.out.println("Hello   World".matches(re7));       //false     这里目前tab字符，在正则表达式中不可用，会显示false
        System.out.println("Hello s World".matches(re6));       //false

        System.out.println("========================匹配非数字===================");
        /**
         *  \d   可以匹配一个数字，而\D则匹配一个非数字。
         */
        String re8 = "12\\D";
        System.out.println("12F".matches(re8));     //true
        System.out.println("12P".matches(re8));     //true
        System.out.println("12=".matches(re8));     //true
        System.out.println("12>".matches(re8));     //true
        System.out.println("12--".matches(re8));        //false

        /**
         * \W可以匹配\w不能匹配的字符，\S可以匹配\s不能匹配的字符，这几个正好是反着来的。
         */

        System.out.println("===================重复匹配==================");
        /**
         * 用\d可以匹配一个数字，例如，A\d可以匹配"A0"，"A1"，如果要匹配多个数字，比如"A380"，怎么办？
         */
        String re9 = "A\\d*";
        String re10 = "B\\d+";
        String re11 = "C\\d?";
        String re12 = "D\\d{3}";        //这里花括号中指定我们的个数
        String re13 = "E\\d{3,6}";      //指定匹配范围
        String re14 = "F\\d{3,}";       //指最低需要3个数字，无上限
        //修饰符*可以匹配任意个字符，包括0个字符。我们用A\d*可以匹配：
        System.out.println("修饰符*可以匹配任意个字符，包括0个字符。我们用A\\d*可以匹配：");
        System.out.println("A".matches(re9));       //true
        System.out.println("A3".matches(re9));      //true
        System.out.println("A38".matches(re9));     //true
        System.out.println("A380".matches(re9));        //true
        System.out.println("A3800".matches(re9));       //true
        System.out.println("AA".matches(re9));      //false

        //修饰符+可以匹配至少一个字符。我们用A\d+可以匹配：
        System.out.println("修饰符+可以匹配至少一个字符。我们用A\\d+可以匹配：");
        System.out.println("B0".matches(re10));     //true
        System.out.println("B000".matches(re10));       //true
        System.out.println("B".matches(re10));      //false

        //修饰符?可以匹配0个或一个字符。我们用A\d?可以匹配：
        System.out.println("修饰符?可以匹配0个或一个字符。我们用A\\d?可以匹配：");
        System.out.println("C".matches(re11));      //true
        System.out.println("CC".matches(re11));     //false
        System.out.println("C1".matches(re11));     //true
        System.out.println("C11".matches(re11));        //false

        //如果我们想精确指定n个字符怎么办？用修饰符{n}就可以。A\d{3}可以精确匹配：
        System.out.println("如果我们想精确指定n个字符怎么办？用修饰符{n}就可以。A\\d{3}可以精确匹配：");
        System.out.println("D1".matches(re12));     //false
        System.out.println("D".matches(re12));      //false
        System.out.println("D12".matches(re12));        //false
        System.out.println("D123".matches(re12));       //true
        System.out.println("D1234".matches(re12));      //false
        System.out.println("D12345".matches(re12));     //false

        //如果我们想指定匹配n~m个字符怎么办？用修饰符{n,m}就可以。A\d{3,5}可以精确匹配：
        System.out.println("如果我们想指定匹配n~m个字符怎么办？用修饰符{n,m}就可以。A\\d{3,5}可以精确匹配：");
        System.out.println("E12".matches(re13));        //false
        System.out.println("E123".matches(re13));       //true
        System.out.println("E1234".matches(re13));      //true
        System.out.println("E12345".matches(re13));     //true
        System.out.println("E123456".matches(re13));        //true
        System.out.println("E1234567".matches(re13));       //false

        //如果没有上限，那么修饰符{n,}就可以匹配至少n个字符。
        System.out.println("如果没有上限，那么修饰符{n,}就可以匹配至少n个字符。");
        System.out.println("F12".matches(re14));        //false
        System.out.println("F123".matches(re14));       //true
        System.out.println("F1234".matches(re14));      //true
        System.out.println("F123456789".matches(re14));     //true

        /**
         * 同上述例子一样：
         *  其它正则表达式也可以使用这些限制符号
         */
    }
}
